//
//  数据模型.swift
//  StealPicture
//
//  Created by 郭斌勇 on 16/8/17.
//  Copyright © 2016年 ?! 郭斌勇. All rights reserved.
//

import UIKit



struct 图片信息_CL {
    var 内容类别:内容类别_CL?
    var 用途类别id:String? //UpdateType
    var id:String? //File_id
    var code:String? //PicCoe
    var 描述:String? //PicLab
    var 更新时间:String? //UpdateTime
    var 原图urlStr:String? //PicUrl
    var 缩略图urlStr:String? //Thumb_PicUrl
    var 原图:UIImage?{
        didSet{
            
            guard 同步到全局量,
                let _ = 用途类别id else{
                return
            }
            用途类别集合_全局量.更改相应图片信息(self)
            
        }
    }
    var 缩略图:UIImage?
    
    var 同步到全局量 = true
    
    
    mutating func 获取原图(回调:((UIImage?)->Void)?){
        
        guard let 解绑原图 = 原图 else{
            
            image下载(原图urlStr!, 响应成功: {(image:UIImage?,响应:NSURLResponse?)->Void in
                self.原图 = image
                if let 解绑回调 = 回调{
                    解绑回调(image)}},
                响应失败: {(错误:NSError)->Void in
                    print("图片下载失败")
            })
            return
        }
        
        
        if let 二次解绑回调 = 回调{
            二次解绑回调(解绑原图)
        }
        
        
    }
    
    mutating func 获取缩略图(回调:((UIImage?)->Void)?){
        
        guard let 解绑缩略图 = 缩略图 else{
        
            image下载(缩略图urlStr!, 响应成功: {(image:UIImage?,响应:NSURLResponse?)->Void in
                self.缩略图 = image
                if let 解绑回调 = 回调{
                    解绑回调(image)}},
                响应失败: {(错误:NSError)->Void in
                    print("图片下载失败")
            })
            
            return
        }
        
        
        if let 二次解绑回调 = 回调{
            二次解绑回调(解绑缩略图)
        }
        
        
    }
    
    
    
    
}



struct 内容类别_CL {
    var 名称:String? //TypeName
    var 描述:String? //Label
    var id:String? //Typeid
    var code:String? //TypeCode
    var 所属用途类别id:String?
    
    var 有变更 = true
    var 需要更新:Bool {
        mutating get{
            let 临时变量 = 有变更
            有变更 = false
            return 临时变量
        }
        
        set {
            有变更 = newValue
        }
        
    }
    
    
    
    var 成员集合 = [图片信息_CL](){
        didSet{
            更新成员id序号目录()
            
            if 成员集合.isEmpty &&  !(oldValue.isEmpty) {
                switch 所属用途类别id! {
                case 用途类别集合_全局量.精挑细选.id! :
                    用途类别集合_全局量.精挑细选.去除没有图片信息的内容类别()
                    用途类别集合_全局量.精挑细选.有变更 = true
                case 用途类别集合_全局量.用户分享.id! :
                    用途类别集合_全局量.用户分享.去除没有图片信息的内容类别()
                    用途类别集合_全局量.用户分享.有变更 = true
                    
                default:break
                }
                
                NSNotificationCenter.defaultCenter().postNotificationName(通知_内容类别成员变为空, object: nil, userInfo: nil)
                print("变为空")
            }
       
        }
    }
    
    var 成员id序号目录 = [String:Int]()
    
    mutating func 更新成员id序号目录(){
        成员id序号目录.removeAll()
        for 序号 in 0 ..< 成员集合.count{
            let 图片id = 成员集合[序号].id
            成员id序号目录[图片id!] = 序号
        }
    }
    
    
    
    mutating func 更改相应图片信息(新图片信息:图片信息_CL){
        guard
            let 图片id = 新图片信息.id,
            let 序号 = 成员id序号目录[图片id]
            else{return}
        成员集合[序号] = 新图片信息
        
        
    }
    
    
    
    mutating func 删除相应图片信息(图片信息:图片信息_CL){
        guard
            let 图片id = 图片信息.id,
            let 序号 = 成员id序号目录[图片id]
            else{return}
        成员集合.removeAtIndex(序号)
        
        有变更 = true

    }
    
    
    

    
    
}




struct 内容类别集合_CL {
    
    var 所有类别 = [String:内容类别_CL](){
        didSet{
            更新_内容类别id集合()
        }
    }// 键为内容类别的id
    
    var 内容类别id集合 = [String]()
    
    
    var 内容类别数目:Int {
        mutating get{
            更新_内容类别id集合()
            return 内容类别id集合.count
        }
        
    }
    
    

    var 所属用途类别id:String? {
        didSet {
            for 内容id in 内容类别id集合 {
                所有类别[内容id]?.所属用途类别id = 所属用途类别id
            }

        }
        
    }
    
    
    mutating func 更新_内容类别id集合(){
        if 内容类别id集合.count != 所有类别.count{
            内容类别id集合.removeAll()
            
            for item in 所有类别.keys{
                内容类别id集合.append(item)
            }//for
            
        }//if
        
        
    }
    
    mutating func 根据内容类别id设置其需要更新(内容类别id:String,需要更新:Bool){
        所有类别[内容类别id]?.需要更新 = 需要更新
    }
    
    mutating func 根据序号返回相应内容类别的更新状态(序号:Int)->Bool?{
        更新_内容类别id集合()
        let 键_id = 内容类别id集合[序号]
        return 所有类别[键_id]?.需要更新
        
    }
    
    mutating func 根据内容类别id返回相应的序号(内容类别id:String)->Int?{
        更新_内容类别id集合()
        return 内容类别id集合.indexOf(内容类别id)
    }
    
    mutating func 根据序号返回相应的类别(序号:Int)->内容类别_CL?{
        更新_内容类别id集合()
        let 键_id = 内容类别id集合[序号]
        return 所有类别[键_id]
        
    }
    
    
    mutating func 根据序号返回相应的类别的图片信息数目(序号:Int)->Int?{
        return 根据序号返回相应的类别(序号)?.成员集合.count
    }

    
    
    mutating func 添加图片(图片信息:图片信息_CL){
        所有类别[(图片信息.内容类别?.id)!]?.成员集合.append(图片信息)
        
    }
    
    
    mutating func 更改相应图片信息(新图片信息:图片信息_CL){
        let 内容类别id = 新图片信息.内容类别?.id
        所有类别[内容类别id!]?.更改相应图片信息(新图片信息)
    }
    
    
    
    mutating func 删除相应图片信息(图片信息:图片信息_CL){
        
        let 内容类别id = 图片信息.内容类别?.id
        所有类别[内容类别id!]?.删除相应图片信息(图片信息)
    }

    
    
    mutating func 去除没有图片信息的内容类别() {
        
        for (key_id,value_内容类别) in 所有类别 {
            
            if value_内容类别.成员集合.isEmpty {
                所有类别.removeValueForKey(key_id)
            }
            
            
        }//for
        
    }//去除没有图片信息的内容类别
    
    
    
}








struct 用途类别_CL {
    var 名称:String?
    var id:String?  //UpdateType
    var 内容类别集合 = 内容类别集合_全局量
    
   

    var 有变更 = true
    var 需要更新获取次数 = 0 {
        didSet{
            if 需要更新获取次数 >= 内容类别集合.内容类别数目 {
                有变更 = false
                需要更新获取次数 = 0
            }
        }
    }
    
    var 需要更新:Bool {
        mutating get{
            if 有变更 {
                需要更新获取次数 += 1
            }
            return 有变更
        }
        
        set {
            有变更 = newValue
        }
        
    }
    
    var 内容类别数目:Int {
        mutating get{
            return 内容类别集合.内容类别数目
        }
        
    }
    
    
    mutating func 更改相应图片信息(新图片信息:图片信息_CL){
        内容类别集合.更改相应图片信息(新图片信息)
    }
    
    
    
    mutating func 删除相应图片信息(图片信息:图片信息_CL){
        内容类别集合.删除相应图片信息(图片信息)
    }
    
    
    mutating func 更新_内容类别id集合(){
        内容类别集合.更新_内容类别id集合()
        
    }
    
    mutating func 根据序号返回相应内容类别的更新状态(序号:Int)->Bool?{
        return 内容类别集合.根据序号返回相应内容类别的更新状态(序号)
    }
    
    
    mutating func 根据序号返回相应的类别(序号:Int)->内容类别_CL?{
        return 内容类别集合.根据序号返回相应的类别(序号)
        
    }
    
    
    mutating func 根据序号返回相应的类别的图片信息数目(序号:Int)->Int?{
        return 内容类别集合.根据序号返回相应的类别的图片信息数目(序号)
    }
    
    
    mutating func 根据内容类别id返回相应的序号(内容类别id:String)->Int?{
        return 内容类别集合.根据内容类别id返回相应的序号(内容类别id)
    }
    
    
    
    
    init() {
    }
    
    init(名称:String?,id:String?){
        self.名称 = 名称
        self.id = id
        内容类别集合 = 内容类别集合_全局量
    }
    
    mutating func 添加图片(图片信息:图片信息_CL){
        内容类别集合.添加图片(图片信息)
    }
    
    
    
    
    mutating func 去除没有图片信息的内容类别() {
        内容类别集合.去除没有图片信息的内容类别()
    }//去除没有图片信息的内容类别
    
    
    
    
}


struct 用途类别集合_CL {
    var 精挑细选 = 用途类别_CL(名称: "精挑细选", id: "0")
    var 用户分享 = 用途类别_CL(名称: "用户分享", id: "1")
    
    
    
    var 原始图片信息数据:[[String:AnyObject]]?
    
    
    var 内容类别分配完成 = false{
        didSet{
            if 内容类别分配完成 {
//                NSNotificationCenter.defaultCenter().postNotificationName(通知_内容类别分配完毕, object: nil, userInfo: nil)
                分配图片信息()
            }
        }
    }
    
    var 图片信息获取完成 = false {
        didSet{
            if 图片信息获取完成 {
                分配图片信息()
            }
        }
    }
    
    var 图片信息分配完成 = false {
        didSet{
            if 图片信息分配完成 {
                去除没有图片信息的内容类别()
            }
        }
    }
    
    var 数据处理完成 = false {
        didSet{
            if 数据处理完成 {
                NSNotificationCenter.defaultCenter().postNotificationName(通知_数据处理完毕, object: nil, userInfo: nil)
                print("发送通知_数据处理完毕")

            }
        }
    }
    
    
    
    
    init(){
        获取并且处理内容类别()
        获取所有图片信息()
    }
    
    
    
    mutating func 分配图片信息(){
        if 图片信息获取完成 && 内容类别分配完成 {
            
            for 原始图片信息字典 in 原始图片信息数据! {
                
                var 内容类别_in = 内容类别_CL()
                内容类别_in.id = String(原始图片信息字典["TypeId"]!)
                内容类别_in.名称 = String(原始图片信息字典["TypeName"]!)
                内容类别_in.code = String(原始图片信息字典["TypeCode"]!)
                内容类别_in.描述 =  String(原始图片信息字典["Label"]!)
                
                
                var 图片信息_in = 图片信息_CL()
                图片信息_in.id = String(原始图片信息字典["File_id"]!)
                图片信息_in.code = String(原始图片信息字典["PicCoe"]!)
                图片信息_in.描述 = String(原始图片信息字典["PicLab"]!)
                图片信息_in.更新时间 = String(原始图片信息字典["UpdateTime"]!)
                图片信息_in.原图urlStr = String(原始图片信息字典["PicUrl"]!)
                图片信息_in.缩略图urlStr = String(原始图片信息字典["Thumb_PicUrl"]!)
                图片信息_in.用途类别id = String(原始图片信息字典["UpdateType"]!)
                图片信息_in.内容类别 = 内容类别_in
                
                
                用途类别集合_全局量.添加图片(图片信息_in)
                
            } // for

            
            图片信息分配完成 = true
            
        } //if
    }
    
    
    
    
    mutating func 去除没有图片信息的内容类别() {
        精挑细选.去除没有图片信息的内容类别()
        用户分享.去除没有图片信息的内容类别()
        数据处理完成 = true
    }
    


    
    
    

    
    mutating func 设置内容类别集合(内容类别集合:内容类别集合_CL){
        精挑细选.内容类别集合 = 内容类别集合
        用户分享.内容类别集合 = 内容类别集合
        
        精挑细选.内容类别集合.所属用途类别id = 精挑细选.id
        用户分享.内容类别集合.所属用途类别id = 用户分享.id
        
    }
    
    
    
    
    mutating func 添加图片(图片信息:图片信息_CL){
        
        
        switch 图片信息.用途类别id!{
        case 精挑细选.id!:
            精挑细选.添加图片(图片信息)
            
        case 用户分享.id!:
            用户分享.添加图片(图片信息)
            
        default:
            print("-------匹配用途分类失败---实际id是:",图片信息.用途类别id!)
        }
        
        
        
    }//添加图片
    
    
    mutating func 更改相应图片信息(新图片信息:图片信息_CL){
        
        switch 新图片信息.用途类别id!{
        case 精挑细选.id!:
            精挑细选.更改相应图片信息(新图片信息)
            
        case 用户分享.id!:
            用户分享.更改相应图片信息(新图片信息)
            
        default:
            print("-------匹配用途分类失败---实际id是:",新图片信息.用途类别id!)
        }
        
    }
    
    
    
    mutating func 删除相应图片信息(图片信息:图片信息_CL){
        
        switch 图片信息.用途类别id!{
        case 精挑细选.id!:
            精挑细选.删除相应图片信息(图片信息)
            用途类别集合数据变更通知(图片信息)
            
        case 用户分享.id!:
            用户分享.删除相应图片信息(图片信息)
            用途类别集合数据变更通知(图片信息)
            
        default:
            print("-------匹配用途分类失败---实际id是:",图片信息.用途类别id!)
        }
    
    
        
    }
    
    
    func 获取用途类别根据图片(图片:图片信息_CL)->用途类别_CL?{
        
        switch (图片.用途类别id)!{
        case 精挑细选.id!:
            return 精挑细选
        case 用户分享.id!:
            return 用户分享
        default:
            return nil
        }
        
    }
    
    func 获取内容类别根据图片(图片:图片信息_CL)->内容类别_CL?{
        let 临时用途类别 = 获取用途类别根据图片(图片)
        return 临时用途类别?.内容类别集合.所有类别[(图片.内容类别?.id)!]
    }
    
    
    
    func 用途类别集合数据变更通知(变更图片:图片信息_CL){
        if 数据处理完成 {
             NSNotificationCenter.defaultCenter().postNotificationName(通知_用途类别集合数据变更, object: nil, userInfo: ["图片id":变更图片.id!,"用途类别id":变更图片.用途类别id!,"内容类别id":(变更图片.内容类别?.id)!])

        }//if
    }//用途类别集合数据变更通知
    
    
}






func 获取并且处理内容类别(){
    
    post下载(urlStr内容类别, 参数: nil, 响应成功: {(数据:AnyObject?,响应:NSURLResponse?)->Void in
        
        
        guard
            let 解封数据 = 数据,
            let 数据字典 = 解封数据 as? [String:AnyObject]
            else {
                print("-----获取错误")
                return
        }
        
        
        
        for item in 数据字典["data"]! as! [[String:String]]{
            var 内容类别_in = 内容类别_CL()
            内容类别_in.名称 = item["TypeName"]
            内容类别_in.id = item["Typeid"]
            内容类别_in.描述 = item["Label"]
            内容类别_in.code = item["TypeCode"]
            
            内容类别集合_全局量.所有类别[内容类别_in.id!] = 内容类别_in
        }
        
        用途类别集合_全局量.设置内容类别集合(内容类别集合_全局量)
        用途类别集合_全局量.内容类别分配完成 = true
        
        
        }, 响应失败:{(错误:NSError)->Void in
            
            print("----获取所有内容类别--错误----",错误)
    })
    
    
    
}





func 获取所有图片信息(){
    
    post下载(urlStr所有图片, 参数: nil, 响应成功: {(数据:AnyObject?,响应:NSURLResponse?)->Void in
        
        
        guard
            let 解封数据 = 数据,
            let 数据字典 = 解封数据 as? [String:AnyObject]
            else {
                print("-----获取错误")
                return
        }
        
        
        用途类别集合_全局量.原始图片信息数据 = 数据字典["data"] as? [[String:AnyObject]]
        if 用途类别集合_全局量.原始图片信息数据 != nil {
            用途类别集合_全局量.图片信息获取完成 = true
        }
        
        
        
        }, 响应失败:{(错误:NSError)->Void in
            
    })
    
}





